java利用ProcessBuilder调用exe程序,修改进程启动的路径,从而输出文件到任意盘符

您所在的位置:网站首页 java processbuilder参数 java利用ProcessBuilder调用exe程序,修改进程启动的路径,从而输出文件到任意盘符

java利用ProcessBuilder调用exe程序,修改进程启动的路径,从而输出文件到任意盘符

2023-10-08 05:39| 来源: 网络整理| 查看: 265

1:百度下ProcessBuilder的简介:

ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。  每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。2. 示例 下面是一个使用修改过工作目录和环境启动进程的例子,并重定向标准输出和标准错误到自定义日志文件。

2:API

//构造方法  //利用指定的操作系统程序和参数构造一个进程生成器。  ProcessBuilder(List command)  //利用指定的操作系统程序和参数构造一个进程生成器。 ProcessBuilder(String… command)  //方法  //返回此进程生成器的操作系统程序和参数。  command()  //设置此进程生成器的操作系统程序和参数。  command(List command)  //设置此进程生成器的操作系统程序和参数。  command(String… command)  //返回此进程生成器的工作目录。  directory()  //设置此进程生成器的工作目录。 directory(File directory)  //返回此进程生成器环境的字符串映射视图。 environment方法获得运行进程的环境变量,得到一个Map,可以修改环境变量  environment()  //返回进程生成器是否合并标准错误和标准输出;true为合并,false为不合并 redirectErrorStream()  //设置此进程生成器的 redirectErrorStream 属性。默认值为false不合并 redirectErrorStream(boolean redirectErrorStream)  //使用此进程生成器的属性启动一个新进程。 start() 

 3:介绍需求和解决办法,

需求:其他公司封装了exe可执行程序和txt输入输出文件,双击exe后,会去INPUT文件夹里的input.txt获取入参然后向OUTPUT文件夹里的output.txt输出结果。我司需要调用exe然后获取到output.txt的内容保存到数据库

由于进程是在jar里面启动的,所以它会在jar的当前路径下找输入输出文件。这样的话我就得把原来的INPUT文件夹和OUTPUT文件夹放到项目里,这样比较鸡肋也不好维护。

解决办法:猜测由于进程所在的目录在哪,它就会去哪寻找输入输出文件。所以可以更改进程的目录为exe所在的目录,就可解决上面的局面。查看ProcessBuilder API发现有个方法,directory(File directory)可以设置此进程生成器的工作目录。而进程是进程生成器生成的,所以改了进程生成器的目录,进程的目录也就相应改变了。

开始更改:

1:封装调用方法

@Slf4j @Component public class ModelTask { /** * @方法描述: 调用exe * @return: void * @Author: carry */ public void runExe(String cmdStr) { BufferedReader bufferedReader = null; try { //创建ProcessBuilder ProcessBuilder pb = new ProcessBuilder(cmdStr); //设置ProcessBuilder工作目录和exe在同一个目录下,这样就会在C:\\model\\XXXXX 下面寻 //找INPUT和OUTPUT文件夹,从而不影响原来的目录层次 pb.directory(new File("C:\\model\\XXXXX")); File file= pb.directory(); String path= file.getAbsolutePath(); System.out.println("路径==============="+path); // 执行命令返回执行的子进程对象 Process proc = pb.start(); // 获取子进程的错误流,并打印 bufferedReader = new BufferedReader(new InputStreamReader(proc.getErrorStream())); String line = null; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } } catch (Exception ex) { ex.printStackTrace(); } finally { if (bufferedReader != null) { try { bufferedReader.close(); } catch (Exception ex) { } } } } }

2:测试调用

@GetMapping("/test") public AjaxResult test() { try { String cmdStr = "C:\\model\\XXXX\\XXXX.exe"; modelTask.runExe(cmdStr); return success(); } catch (Exception e) { log.error(e.getMessage()); return error(e.getMessage()); } }

3:执行成功



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3